package com.monitor.filter;

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;

/**
 * 图像过滤器，用于识别不良图片
 */
public class ImageFilter implements ContentFilter {
    private FilterSensitivity sensitivity = FilterSensitivity.MEDIUM;
    
    @Override
    public boolean containsInappropriateContent(String imagePath) {
        try {
            File imageFile = new File(imagePath);
            if (!imageFile.exists()) {
                return false;
            }
            
            BufferedImage image = ImageIO.read(imageFile);
            if (image == null) {
                return false;
            }
            
            // 根据灵敏度级别调整分析策略
            switch (sensitivity) {
                case HIGH:
                    return highSensitivityAnalysis(image);
                case MEDIUM:
                    return mediumSensitivityAnalysis(image);
                case LOW:
                    return lowSensitivityAnalysis(image);
                default:
                    return mediumSensitivityAnalysis(image);
            }
            
        } catch (IOException e) {
            e.printStackTrace();
            return false;
        }
    }
    
    /**
     * 分析图像内容是否包含不良信息（高灵敏度）
     * 注意：这里只是模拟实现，实际应用中需要使用专业的图像识别算法
     */
    private boolean highSensitivityAnalysis(BufferedImage image) {
        // 高灵敏度下的图像分析
        // 在实际应用中，这里应该使用专业的图像识别算法
        // 例如肤色检测、形状识别等
        
        // 这里使用简单的肤色比例检测作为示例
        return analyzeImageContent(image, 0.3); // 30%的肤色像素比例作为阈值
    }
    
    /**
     * 分析图像内容是否包含不良信息（中灵敏度）
     */
    private boolean mediumSensitivityAnalysis(BufferedImage image) {
        // 中灵敏度下的图像分析
        return analyzeImageContent(image, 0.5); // 50%的肤色像素比例作为阈值
    }
    
    /**
     * 分析图像内容是否包含不良信息（低灵敏度）
     */
    private boolean lowSensitivityAnalysis(BufferedImage image) {
        // 低灵敏度下的图像分析
        return analyzeImageContent(image, 0.7); // 70%的肤色像素比例作为阈值
    }
    
    /**
     * 分析图像内容
     * 注意：这是一个简化的实现，仅用于演示
     * @param image 要分析的图像
     * @param threshold 肤色像素比例阈值
     * @return 如果肤色像素比例超过阈值，返回true
     */
    private boolean analyzeImageContent(BufferedImage image, double threshold) {
        int width = image.getWidth();
        int height = image.getHeight();
        int totalPixels = width * height;
        int skinColorPixels = 0;
        
        // 遍历图像像素
        for (int y = 0; y < height; y++) {
            for (int x = 0; x < width; x++) {
                int rgb = image.getRGB(x, y);
                if (isSkinColor(rgb)) {
                    skinColorPixels++;
                }
            }
        }
        
        // 计算肤色像素比例
        double skinColorRatio = (double) skinColorPixels / totalPixels;
        
        // 如果肤色像素比例超过阈值，则认为可能包含不良内容
        return skinColorRatio > threshold;
    }
    
    /**
     * 判断像素是否为肤色
     * 注意：这是一个简化的实现，仅用于演示
     * @param rgb RGB颜色值
     * @return 如果是肤色返回true
     */
    private boolean isSkinColor(int rgb) {
        int r = (rgb >> 16) & 0xFF;
        int g = (rgb >> 8) & 0xFF;
        int b = rgb & 0xFF;
        
        // 简单的肤色检测规则
        // 在实际应用中，应该使用更复杂的肤色模型
        return (r > 60 && g > 40 && b > 20 && 
                r > g && r > b && 
                (r - g) > 15 && 
                (r - b) > 15 && 
                (r - g) > (r - b));
    }
    
    @Override
    public String getFilterName() {
        return "图像过滤器";
    }
    
    @Override
    public String getFilterDescription() {
        return "通过图像内容分析自动识别并拦截色情、暴力图片";
    }
    
    @Override
    public void setSensitivity(FilterSensitivity sensitivity) {
        this.sensitivity = sensitivity;
    }
    
    @Override
    public FilterSensitivity getSensitivity() {
        return sensitivity;
    }
}